#ifndef ICAMERA_H
#define ICAMERA_H

#include <GL/glew.h>
#include <GL/glfw.h>
#include <string>
#include <map>
#include <cmath>

#include "Vector3.h"

namespace glow
{
	typedef std::map<std::string, unsigned int> KeyMap;
	typedef std::map<std::string, bool> KeyStates;

	class SHARED ICamera
	{
	public :
        /**
         *  Default Constructor
         **/
		ICamera(){}

        /**
         *  Destructor of the camera
         **/
		virtual ~ICamera(){}

        /**
         *  Set the defaults keys to move the camera in the 3d-space
         **/
		virtual void setDefaultKeyMap() = 0;

        /**
         *  Set the keys to move the camera in the 3d-space
		 *\param the keymap of the camera
         **/
		virtual void setKeyMap(const KeyMap &kmap) = 0;


        /**
         *  Get the position of the camera
		 *\return the position of the camera
         **/
		virtual const Vector3d &getPosition() const = 0;

        /**
         *  Get the position of the target of the camera
		 *\return the angle of the camera
         **/
		virtual const Vector3d &getTarget() const = 0;

        /**
         *  Change the speed of movement of the camera
         *  Note : the speed equals the parameter. That not increment.
		 *\param the speed's movement of the camera
         **/
		virtual void setSpeed(double speed) = 0;

        /**
         *  Change the sensitivity of the camera
         *  Note : the sensitivity equals the parameter. That not increment.
		 *\param the sensitivity of the camera
         **/
        virtual void setSensivity(double sensivity) = 0;

        /**
         * Reset all attribute of the camera
         **/
		virtual void reset() = 0;

        /**
         * Set the parameters in the camera attributes and show
		 *\param the position of the camera
		 *\param the position target by the camera
		 *\param the angle of the camera
         **/
		virtual void lookAt(Vector3d pos, Vector3d targ, Vector3d ang) = 0;

        /**
         * Show with the camera attributes
         **/
        virtual void look() = 0;

        /**
         * Find the event bind with the camera
         **/
		virtual void getEvent() = 0;

        /**
         *  Update attributes with the event find
         **/
		virtual void animate() = 0;

  };
}


#endif
